package com.yonyou.hxjy.service.dingtalk.Impl.toysImpl;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.yonyou.hxjy.dao.ProcessinstanceMapper;
import com.yonyou.hxjy.entity.ProcessInstance;
import com.yonyou.hxjy.service.dingtalk.DingtalkExpenseClaimToYs;
import com.yonyou.hxjy.service.dingtalk.DingtalkProcessInstanceToYs;
import com.yonyou.hxjy.service.dingtalk.Impl.YsDataGetService;
import com.yonyou.hxjy.utils.RedisUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class DingtalkExpenseClaimToYsImpl implements DingtalkExpenseClaimToYs {

    @Autowired
    private YsDataGetService ysDataGetService;

    @Autowired
    private DingtalkProcessInstanceToYs defaultDataService;

    @Autowired
    private ProcessinstanceMapper processinstanceMapper;

    private static final Logger logger = LoggerFactory.getLogger(DingtalkExpenseClaimToYs.class);
    /**
     * 费用报销资金收款单保存到Ys中
     * @param jsonObjectList
     * @return
     */
    @Override
    public List<JSONObject> expenseClaim_toYsJson(List<JSONObject> jsonObjectList,List<String> processInstanceIdList) {

        List<JSONObject> ysJsonResponseList = new ArrayList<>(); //返回结果列表
        Map<String, Object> dataMap = null; //参数汇总
        //获取银行列表
        List<JSONObject> bankList = ysDataGetService.getBankDetailsMessage();
        //保存类型
        String saveType = "";
        //单据id
        String businessId;
        //遍历ID集合构建参数
        for (JSONObject jsonObject : jsonObjectList) {
            //获取审批实例业务编号
            businessId = jsonObject.getJSONObject("result").getStr("businessId");
            try {
                dataMap = new HashMap<>();
                //构建资金付款主表参数
                Map <String,Object> paramMap = new HashMap<>();
                String isoDateTime = jsonObject.getJSONObject("result").getStr("finishTime");
                JSONObject tasks = jsonObject.getJSONObject("result").getJSONArray("tasks").getJSONObject(0);
                String pcUrl = tasks.getStr("pcUrl");
                String processInstanceId = StringUtils.substringBetween(pcUrl, "procInsId=", "&");
                paramMap.put("vouchdate",defaultDataService.dateFormChange(isoDateTime)); //日期
                paramMap.put("exchangeRateType_code",defaultDataService.EXCHANGE_RATE_TYPE_CODE); //汇率类型
                paramMap.put("exchRate",defaultDataService.EXCH_RAGE); //汇率
                paramMap.put("currency_code",defaultDataService.CURRENCY_CODE); //币种ID
                paramMap.put("_status","Insert"); //动作

                //构建资金付款单子表参数
                List<Map<String, Object>> fundPaymentBList = new ArrayList<>();
                Map<String, Object> fundPaymentBItem = new HashMap<>();
                fundPaymentBItem.put("quickType_code", defaultDataService.QUICK_TYPE_CODE[0]); // 款项类型(费用)
                fundPaymentBItem.put("settlestatus", "1"); // 结算方式
                fundPaymentBItem.put("caobject", 4); // 付款对象
                fundPaymentBItem.put("oppositeobjectname", "无"); // 收款对象单位
                fundPaymentBItem.put("_status", "Insert"); // 动作

                JSONArray jsonArray = jsonObject.getJSONObject("result").getJSONArray("formComponentValues");
                //遍历组件里的value值
                for (int i = 0; i < jsonArray.size(); i++) {
                    JSONObject item = jsonArray.getJSONObject(i);
                    //设置金额
                    if ("MoneyField-JPATT8BR".equals(item.getStr("id"))){
                        double oriSum = item.getDouble("value");
                        if (oriSum < 0){
                            saveType = "fundCollection";
                            paramMap.put("tradetype_code", defaultDataService.TRADE_TYPE_CODE[3]); //交易类型(其他付款)
                            fundPaymentBItem.put("oriSum", Math.abs(oriSum)); //转为正数
                        }else {
                            saveType = "fundPayment";
                            paramMap.put("tradetype_code", defaultDataService.TRADE_TYPE_CODE[0]); //交易类型(报销付款)
                            fundPaymentBItem.put("oriSum", oriSum);
                        }
                        continue;
                    }
                    //设置部门编码
                    if ("DepartmentField_20PW1THF77EO0".equals(item.getStr("id"))){
                        String dept_code = item.getJSONArray("extValue").getJSONObject(0).getStr("itemId");
                        paramMap.put("dept_code",dept_code);
                        continue;
                    }
                    //设置主体(组织单元),根据组织单元获取默认银行账号
                    if ("DDSelectField_10KDNQ1JIO8W0".equals(item.getStr("id"))){
                        //缓存到redis中
                        String uitCodeKey = "组织名称:" + item.getStr("value");

                        String uitCode = (String) RedisUtils.get(uitCodeKey);

                        //不存在发送请求获取组织编码
                        if (StringUtils.isEmpty(uitCode)){
                            //根据组织名称获取code
                            uitCode = ysDataGetService.getOrgUitCode(item.getStr("value"));
                            RedisUtils.set(uitCodeKey, uitCode);
                        }
                        if (uitCode!=null && !uitCode.isEmpty()){
                            paramMap.put("accentityRaw_code",uitCode ); //会计主体code
                            paramMap.put("accentity_code", uitCode); //资金组织code
                            paramMap.put("org_code", uitCode); //业务组织code
                            //获取默认银行数据
                            String bankCode = defaultDataService.getBankCode(item.getStr("value"),bankList);
                            //logger.info("获取的默认银行账号{}",bankCode);
                            if (bankCode!=null && !bankCode.isEmpty()){
                                paramMap.put("enterprisebankaccount_code",bankCode);// 企业银行账户编码
                                fundPaymentBItem.put("enterprisebankaccount_code", bankCode); // (子表)企业银行账户编码

                            }else {
                                throw new RuntimeException("{error:\"获取企业银行账号失败-费用报销审批单"+businessId+"中默认银行账号不存在！！！\"}");
                            }
                        }else {
                            throw new RuntimeException("{error:\"获取组织code失败-费用报销审批单"+businessId+"中付款组织单元不存在！！！\"}");
                        }
                        continue;
                    }
                    //设置收款人银行账号
                    if ("RecipientAccountField-JVM0OK11".equals(item.getStr("id"))){
                        if (item.containsKey("extValue")){
                            JSONObject extValueJson = item.getJSONObject("extValue");
                            String identityType = extValueJson.getStr("identityType");
                            //结算方式判断
                            if ("CORP_BANK_CARD".equals(identityType) || "PERSONAL_BANK_CARD".equals(identityType)){
                                paramMap.put("settlemode_code",defaultDataService.SETTLEMODE_CODE[0]); //结算方式(银行转账)
                                String cardNo = extValueJson.getStr("cardNo");
                                fundPaymentBItem.put("oppositeaccountno", cardNo); // 收款(付款)银行账号
                                //logger.info("转入银行账号:{}",cardNo);
                            }else if ("ALIPAY_ACCOUNT".equals(identityType)){
                                //结算方式为支付宝支付-无需设置账号
                                paramMap.put("settlemode_code",defaultDataService.SETTLEMODE_CODE[1]); //结算方式(支付宝2)
                            }
                        }
                        continue;
                    }
                    //费用项目(二级财务费用)
                    if ("DDSelectField_20WPMBFTVLOG0".equals(item.getStr("id"))){
                        if (item.containsKey("extValue")){
                            String expenseItem = item.getJSONObject("extValue").getStr("label");
                            fundPaymentBItem.put("expenseitem_code",expenseItem);
                        }
                        continue;
                    }
                    //费用项目(二级研发类)
                    if ("DDSelectField_6INU1IS5KMS0".equals(item.getStr("id"))){
                        if (item.containsKey("extValue")){
                            String expenseItem = item.getJSONObject("extValue").getStr("label");
                            fundPaymentBItem.put("expenseitem_code",expenseItem);
                        }
                        continue;
                    }
                    //费用项目(二级行政类)
                    if ("DDSelectField_W7ADMZ4UZ400".equals(item.getStr("id"))){
                        if (item.containsKey("extValue")){
                            String expenseItem = item.getJSONObject("extValue").getStr("label");
                            fundPaymentBItem.put("expenseitem_code",expenseItem);
                        }
                        continue;
                    }
                    //费用项目(二级营销类)
                    if ("DDSelectField_ZQFKR6ZP8SG0".equals(item.getStr("id"))){
                        if (item.containsKey("extValue")){
                            String expenseItem = item.getJSONObject("extValue").getStr("label");
                            fundPaymentBItem.put("expenseitem_code",expenseItem);
                        }
                        continue;
                    }
                    //费用项目(二级人事类)
                    if ("DDSelectField_1MESIS5RJN8G0".equals(item.getStr("id"))){
                        if (item.containsKey("extValue")){
                            String expenseItem = item.getJSONObject("extValue").getStr("label");
                            fundPaymentBItem.put("expenseitem_code",expenseItem);
                        }
                        continue;
                    }
                    //费用项目(二级售后类)
                    if ("DDSelectField_B2583K1GFOG0".equals(item.getStr("id"))){
                        if (item.containsKey("extValue")){
                            String expenseItem = item.getJSONObject("extValue").getStr("label");
                            fundPaymentBItem.put("expenseitem_code",expenseItem);
                        }
                    }
                }
                JSONObject jsonObjectResponse;
                ProcessInstance processInstance;
                processInstance = new ProcessInstance();
                processInstance.setUpdateDate(new Date());
                processInstance.setProcessInstanceId(processInstanceId);
                //发送请求保存到ys中
                if ("fundCollection".equals(saveType)) {
                    //保存到资金收款单中
                    fundPaymentBList.add(fundPaymentBItem);
                    paramMap.put("FundCollection_b", fundPaymentBList); //将子表放入到主表中
                    dataMap.put("data", paramMap); //最终封装的数据
                    jsonObjectResponse = defaultDataService.sendPostToSaveFundCollection(dataMap); //发送请求
                    //处理响应结果
                    ProcessResponseResults(jsonObjectResponse,businessId,saveType,processInstance);
                }else {
                    //保存到资金付款单中
                    fundPaymentBList.add(fundPaymentBItem);
                    paramMap.put("FundPayment_b", fundPaymentBList); //将子表放入到主表中
                    dataMap.put("data", paramMap); //最终封装的数据
                    jsonObjectResponse = defaultDataService.sendPostToSaveFundPayment(dataMap); //发送请求
                    //处理响应结果
                    ProcessResponseResults(jsonObjectResponse, businessId,saveType,processInstance);

                }
                ysJsonResponseList.add(jsonObjectResponse.getJSONObject("data"));

                //ysJsonResponseList.add(new JSONObject(dataMap));
            }catch (Exception e){
                //回显错误信息
                ysJsonResponseList.add(new JSONObject(e.getMessage()));
                //记录xxl-job日志
                defaultDataService.InsertLogger(businessId,"0",e.getMessage(),"panzhi1");
                logger.error("费用报销错误信息:{}",e.getMessage());
                logger.info("--------------------------------------------------------------------------------");

            }
        }
        return ysJsonResponseList;
    }

//    @Override
//    public List<JSONObject> expenseClaim_toYsJsonNew(List<JSONObject> jsonObjectList) {
//        List<JSONObject> ysJsonResponseList = new ArrayList<>(); //返回结果列表
//        Map<String, Object> dataMap = null; //参数汇总
//        //获取银行列表
//        List<JSONObject> bankList = ysDataGetService.getBankDetailsMessage();
//        //保存类型
//        String saveType = "";
//        //单据id
//        String businessId;
//        //遍历ID集合构建参数
//        for (JSONObject jsonObject : jsonObjectList) {
//            //获取审批实例业务编号
//            businessId = jsonObject.getJSONObject("result").getStr("businessId");
//            try {
//                dataMap = new HashMap<>();
//                //构建资金付款主表参数
//                Map <String,Object> paramMap = new HashMap<>();
//                String isoDateTime = jsonObject.getJSONObject("result").getStr("finishTime");
//                paramMap.put("vouchdate",defaultDataService.dateFormChange(isoDateTime)); //日期
//                paramMap.put("exchangeRateType_code",defaultDataService.EXCHANGE_RATE_TYPE_CODE); //汇率类型
//                paramMap.put("exchRate",defaultDataService.EXCH_RAGE); //汇率
//                paramMap.put("currency_code",defaultDataService.CURRENCY_CODE); //币种ID
//                paramMap.put("_status","Insert"); //动作
//
//                //构建资金付款单子表参数
//                List<Map<String, Object>> fundPaymentBList = new ArrayList<>();
//                Map<String, Object> fundPaymentBItem = new HashMap<>();
//                fundPaymentBItem.put("quickType_code", defaultDataService.QUICK_TYPE_CODE[0]); // 款项类型(费用)
//                fundPaymentBItem.put("settlestatus", "1"); // 结算方式
//                fundPaymentBItem.put("caobject", 4); // 付款对象
//                fundPaymentBItem.put("oppositeobjectname", "无"); // 收款对象单位
//                fundPaymentBItem.put("_status", "Insert"); // 动作
//
//                JSONArray jsonArray = jsonObject.getJSONObject("result").getJSONArray("formComponentValues");
//                //遍历组件里的value值
//                for (int i = 0; i < jsonArray.size(); i++) {
//                    JSONObject item = jsonArray.getJSONObject(i);
//                    //设置金额
//                    if ("MoneyField-JPATT8BR".equals(item.getStr("id"))){
//                        double oriSum = item.getDouble("value");
//                        if (oriSum < 0){
//                            saveType = "fundCollection";
//                            paramMap.put("tradetype_code", defaultDataService.TRADE_TYPE_CODE[3]); //交易类型(其他付款)
//                            fundPaymentBItem.put("oriSum", Math.abs(oriSum)); //转为正数
//                        }else {
//                            saveType = "fundPayment";
//                            paramMap.put("tradetype_code", defaultDataService.TRADE_TYPE_CODE[0]); //交易类型(报销付款)
//                            fundPaymentBItem.put("oriSum", oriSum);
//                        }
//                        continue;
//                    }
//                    //设置部门编码
//                    if ("DepartmentField_20PW1THF77EO0".equals(item.getStr("id"))){
//                        String dept_code = item.getJSONArray("extValue").getJSONObject(0).getStr("itemId");
//                        paramMap.put("dept_code",dept_code);
//                        continue;
//                    }
//                    //设置主体(组织单元),根据组织单元获取默认银行账号
//                    if ("DDSelectField_10KDNQ1JIO8W0".equals(item.getStr("id"))){
//                        //缓存到redis中
//                        String uitCodeKey = "组织名称:" + item.getStr("value");
//
//                        String uitCode = (String) RedisUtils.get(uitCodeKey);
//
//                        //不存在发送请求获取组织编码
//                        if (StringUtils.isEmpty(uitCode)){
//                            //根据组织名称获取code
//                            uitCode = ysDataGetService.getOrgUitCode(item.getStr("value"));
//                            RedisUtils.set(uitCodeKey, uitCode);
//                        }
//                        if (uitCode!=null && !uitCode.isEmpty()){
//                            paramMap.put("accentityRaw_code",uitCode ); //会计主体code
//                            paramMap.put("accentity_code", uitCode); //资金组织code
//                            paramMap.put("org_code", uitCode); //业务组织code
//                            //获取默认银行数据
//                            String bankCode = defaultDataService.getBankCode(item.getStr("value"),bankList);
//                            //logger.info("获取的默认银行账号{}",bankCode);
//                            if (bankCode!=null && !bankCode.isEmpty()){
//                                paramMap.put("enterprisebankaccount_code",bankCode);// 企业银行账户编码
//                                fundPaymentBItem.put("enterprisebankaccount_code", bankCode); // (子表)企业银行账户编码
//
//                            }else {
//                                throw new RuntimeException("{error:\"获取企业银行账号失败-费用报销审批单"+businessId+"中默认银行账号不存在！！！\"}");
//                            }
//                        }else {
//                            throw new RuntimeException("{error:\"获取组织code失败-费用报销审批单"+businessId+"中付款组织单元不存在！！！\"}");
//                        }
//                        continue;
//                    }
//                    //设置收款人银行账号
//                    if ("RecipientAccountField-JVM0OK11".equals(item.getStr("id"))){
//                        if (item.containsKey("extValue")){
//                            JSONObject extValueJson = item.getJSONObject("extValue");
//                            String identityType = extValueJson.getStr("identityType");
//                            //结算方式判断
//                            if ("CORP_BANK_CARD".equals(identityType) || "PERSONAL_BANK_CARD".equals(identityType)){
//                                paramMap.put("settlemode_code",defaultDataService.SETTLEMODE_CODE[0]); //结算方式(银行转账)
//                                String cardNo = extValueJson.getStr("cardNo");
//                                fundPaymentBItem.put("oppositeaccountno", cardNo); // 收款(付款)银行账号
//                                //logger.info("转入银行账号:{}",cardNo);
//                            }else if ("ALIPAY_ACCOUNT".equals(identityType)){
//                                //结算方式为支付宝支付-无需设置账号
//                                paramMap.put("settlemode_code",defaultDataService.SETTLEMODE_CODE[1]); //结算方式(支付宝2)
//                            }
//                        }
//                        continue;
//                    }
//                    //费用项目(二级财务费用)
//                    if ("DDSelectField_20WPMBFTVLOG0".equals(item.getStr("id"))){
//                        if (item.containsKey("extValue")){
//                            String expenseItem = item.getJSONObject("extValue").getStr("label");
//                            fundPaymentBItem.put("expenseitem_code",expenseItem);
//                        }
//                        continue;
//                    }
//                    //费用项目(二级研发类)
//                    if ("DDSelectField_6INU1IS5KMS0".equals(item.getStr("id"))){
//                        if (item.containsKey("extValue")){
//                            String expenseItem = item.getJSONObject("extValue").getStr("label");
//                            fundPaymentBItem.put("expenseitem_code",expenseItem);
//                        }
//                        continue;
//                    }
//                    //费用项目(二级行政类)
//                    if ("DDSelectField_W7ADMZ4UZ400".equals(item.getStr("id"))){
//                        if (item.containsKey("extValue")){
//                            String expenseItem = item.getJSONObject("extValue").getStr("label");
//                            fundPaymentBItem.put("expenseitem_code",expenseItem);
//                        }
//                        continue;
//                    }
//                    //费用项目(二级营销类)
//                    if ("DDSelectField_ZQFKR6ZP8SG0".equals(item.getStr("id"))){
//                        if (item.containsKey("extValue")){
//                            String expenseItem = item.getJSONObject("extValue").getStr("label");
//                            fundPaymentBItem.put("expenseitem_code",expenseItem);
//                        }
//                        continue;
//                    }
//                    //费用项目(二级人事类)
//                    if ("DDSelectField_1MESIS5RJN8G0".equals(item.getStr("id"))){
//                        if (item.containsKey("extValue")){
//                            String expenseItem = item.getJSONObject("extValue").getStr("label");
//                            fundPaymentBItem.put("expenseitem_code",expenseItem);
//                        }
//                        continue;
//                    }
//                    //费用项目(二级售后类)
//                    if ("DDSelectField_B2583K1GFOG0".equals(item.getStr("id"))){
//                        if (item.containsKey("extValue")){
//                            String expenseItem = item.getJSONObject("extValue").getStr("label");
//                            fundPaymentBItem.put("expenseitem_code",expenseItem);
//                        }
//                    }
//                }
//                JSONObject jsonObjectResponse;
//                //发送请求保存到ys中
//                if ("fundCollection".equals(saveType)) {
//                    //保存到资金收款单中
//                    fundPaymentBList.add(fundPaymentBItem);
//                    paramMap.put("FundCollection_b", fundPaymentBList); //将子表放入到主表中
//                    dataMap.put("data", paramMap); //最终封装的数据
//                    jsonObjectResponse = defaultDataService.sendPostToSaveFundCollection(dataMap); //发送请求
//                    //处理响应结果
//                    ProcessResponseResults(jsonObjectResponse,businessId,saveType);
//                }else {
//                    //保存到资金付款单中
//                    fundPaymentBList.add(fundPaymentBItem);
//                    paramMap.put("FundPayment_b", fundPaymentBList); //将子表放入到主表中
//                    dataMap.put("data", paramMap); //最终封装的数据
//                    jsonObjectResponse = defaultDataService.sendPostToSaveFundPayment(dataMap); //发送请求
//                    //处理响应结果
//                    ProcessResponseResults(jsonObjectResponse, businessId,saveType);
//
//                }
//                ysJsonResponseList.add(jsonObjectResponse.getJSONObject("data"));
//                //ysJsonResponseList.add(new JSONObject(dataMap));
//            }catch (Exception e){
//                //回显错误信息
//                ysJsonResponseList.add(new JSONObject(e.getMessage()));
//                //记录xxl-job日志
//                defaultDataService.InsertLogger(businessId,"0",e.getMessage(),"panzhi1");
//                logger.error("费用报销错误信息:{}",e.getMessage());
//                logger.info("--------------------------------------------------------------------------------");
//
//            }
//        }
//        return ysJsonResponseList;
//    }

    /**
     * 处理响应结果
     * @param jsonObjectResponse
     * @param businessId
     */
    public void ProcessResponseResults(JSONObject jsonObjectResponse,String businessId,String saveType,ProcessInstance processInstance){
        //设置返回单据类型
        String saveTypeResult;
        if (saveType.equals("fundCollection")){
            saveTypeResult = "收款单";
        }else {
            saveTypeResult = "付款单";
        }
        //处理响应结果
        if (jsonObjectResponse != null){
            logger.info("响应编码{}", jsonObjectResponse.getStr("code"));
            if (jsonObjectResponse.getStr("code").equals("200")){
                //保存成功，数据库中修改标记
                if (processInstance != null){
                    //根据审批实例id修改保存状态
                    System.out.println(processInstance);
                    processinstanceMapper.logicSaveById(processInstance);
                }
                logger.info("费用报销单据{}[{}]{}", businessId, saveTypeResult,jsonObjectResponse.getStr("message"));  //打印保存成功信息
            }else {
                //调用api报错回显
                //JSONArray responseJSONArray = jsonObjectResponse.getJSONArray("message");
                //api报错信息
//                StringBuilder errorMessage = new StringBuilder();
//                for (int i = 0; i< responseJSONArray.size();i++){
//                    errorMessage.append("[").append(responseJSONArray.getJSONObject(0).getStr("message")).append("]");
//                }
                throw new RuntimeException(String.format("{error:\"调用[%s]api出错-费用报销审批单据%s中[%s]\"}", saveTypeResult,businessId, jsonObjectResponse));
            }
        }
        logger.info("------------------------------------------------------------------------------");
    }
}
